#ifndef COLA_H
#define COLA_H

#include "Secuencia.h"

#include <iostream>
typedef unsigned long int nat;
using namespace std;

template <class T1> class iterCola;
template <class T2> class Secuencia;
template <class T> class Cola {
         public:
         
         friend class iterCola<T>;
         
                //Constructores y destructores
                Cola(void);
                Cola(const Cola<T> &c);
                ~Cola(void);
                
                //funciones publicas
                void encolar(const T &elem);
                bool vacia(void) const;
                const T& proximo(void);
                void desencolar(void);
                nat tamano(void) const;
                void operator=(const Cola<T> &c);
                bool operator==(const Cola<T> &c) const;
                bool operator!=(const Cola<T> &c) const;
                template<class T2> friend ostream & operator<<(ostream &out, const Cola<T2> &m);
         
         private:
                 Secuencia<T> s; 

};

/*****************************************************************************/
template<class T> Cola<T>::Cola(void){
               s;
}
/*****************************************************************************/
template<class T> Cola<T>::Cola(const Cola<T> &c){
                s(c.s);
}

/*****************************************************************************/                              
template<class T> Cola<T>::~Cola(void){
               while(s.tamano() > 0){
               s.fin();
               }
}               

/*****************************************************************************/
template<class T> void Cola<T>::encolar(const T &elem){
               s.agregarAtras(elem);
}
/*****************************************************************************/               
template<class T> bool Cola<T>::vacia(void){
               return s.tamano() == 0;
}
/*****************************************************************************/                              
template<class T> const T& Cola<T>::proximo(void){
               return (this->s).primero();
}
/*****************************************************************************/
template<class T> void Cola<T>::desencolar(void){
               s.fin();
}
/*****************************************************************************/    
template<class T> nat Cola<T>::tamano(void) const{
               return s.tamano();
}
/*****************************************************************************/                              
template<class T> void Cola<T>::operator=(const Cola<T> &c){
               s = c.s;
}
/*****************************************************************************/
template<class T> bool Cola<T>::operator==(const Cola<T> &c) const{
               return s == c.s;
}
/*****************************************************************************/         
template<class T> bool Cola<T>::operator!=(const Cola<T> &c) const{
               return s != c.s;
}
/*****************************************************************************/                              
template<class T2> ostream & operator<<(ostream &out, const Cola<T2> &m){
               out << m.s;
               return out;
}
/*****************************************************************************/
#endif
